Skip to content

[NV] minimax-m3-b200/b300-mtp: update fp8 MTP to vLLM nightly / [NV] minimax-m3-b200/b300-mtp:将 FP8 MTP 更新至 vLLM nightly - #2337

Open
xinli-sw wants to merge 4 commits into
mainfrom
minimaxm3-fp8-b200-b300-vllm-mtp-nightly
Open

[NV] minimax-m3-b200/b300-mtp: update fp8 MTP to vLLM nightly / [NV] minimax-m3-b200/b300-mtp:将 FP8 MTP 更新至 vLLM nightly#2337
xinli-sw wants to merge 4 commits into
mainfrom
minimaxm3-fp8-b200-b300-vllm-mtp-nightly

Conversation

@xinli-sw

@xinli-sw xinli-sw commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

Summary

Single-node MTP (EAGLE3) MiniMax-M3 MXFP8 on B200/B300 (minimaxm3-fp8-b200-vllm-mtp, minimaxm3-fp8-b300-vllm-mtp):

  • Bump image to vllm/vllm-openai:nightly-4080263bb2c5d10deac17aaeb88e0823bc35bca9
  • EAGLE3 draft head Inferact/MiniMax-M3-EAGLE3Inferact/MiniMax-M3-EAGLE3-GQA
  • Speculative attention_backend TRITON_ATTNFLASH_ATTN; num_speculative_tokens kept at 3
  • Consolidate --attention-config with indexer_kv_dtype: fp8; set --stream-interval 32
  • Drop the inline sparse_attention_msa contiguity patch — the fix ships in the nightly image

中文说明

在 B200/B300 上更新单节点 MTP(EAGLE3)MiniMax-M3 MXFP8 配置(minimaxm3-fp8-b200-vllm-mtpminimaxm3-fp8-b300-vllm-mtp):

  • 将镜像升级至 vllm/vllm-openai:nightly-4080263bb2c5d10deac17aaeb88e0823bc35bca9
  • 将 EAGLE3 草稿模型头从 Inferact/MiniMax-M3-EAGLE3 更新为 Inferact/MiniMax-M3-EAGLE3-GQA
  • 将投机解码的 attention_backendTRITON_ATTN 切换为 FLASH_ATTNnum_speculative_tokens 保持为 3
  • 合并 --attention-config 并设置 indexer_kv_dtype: fp8;同时设置 --stream-interval 32
  • 移除内联的 sparse_attention_msa 内存连续性补丁——该修复已包含在 nightly 镜像中

…ASH_ATTN, stream-interval 32

Single-node MTP (minimaxm3-fp8-b200-vllm-mtp, minimaxm3-fp8-b300-vllm-mtp):
- image -> vllm/vllm-openai:nightly-4080263bb2c5d10deac17aaeb88e0823bc35bca9
- EAGLE3 draft head -> Inferact/MiniMax-M3-EAGLE3-GQA
- speculative attention_backend TRITON_ATTN -> FLASH_ATTN; num_speculative_tokens kept at 3
- consolidate --attention-config with indexer_kv_dtype fp8; --stream-interval 32
- drop the sparse_attention_msa contiguity patch (shipped in the nightly image)
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution! Please reach out to respective companies' CODEOWNER to fill in the latest PR_REVIEW_CHECKLIST.md before pinging core maintainer on Slack for review. In order for the signoff PR check bot to trigger, you must follow the PR_REVIEW_CHECKLIST.md template correctly, including the phrase As a PR reviewer and CODEOWNER, I have reviewed this and have.

For PR verification, add the full-sweep-fail-fast label (strongly recommended) to this PR — the benchmark sweep only runs on labeled PRs. Use full-sweep-enabled only if you need matrix jobs to keep running past a failure.

PR authors are responsible for ensuring that after merging, all GitHub Action jobs fully pass. A lot of the time, failures are just flakes and simply re-running the failed jobs will fix it. See GitHub's docs on re-running failed jobs


感谢你的贡献!请联系相应公司的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,然后再在 Slack 上联系核心维护者进行审阅。为了触发 signoff PR 检查机器人,你必须正确遵循 PR_REVIEW_CHECKLIST.md 模板,包括保留英文语句 As a PR reviewer and CODEOWNER, I have reviewed this and have

如需进行 PR 验证,请为此 PR 添加 full-sweep-fail-fast 标签(强烈推荐)— 基准测试 sweep 仅在带有标签的 PR 上运行。仅当需要矩阵任务在失败后继续运行时才使用 full-sweep-enabled

PR 作者有责任确保合并后所有 GitHub Action 任务完全通过。 很多时候失败只是偶发抖动(flake),重新运行失败的任务即可解决。参见 GitHub 关于重新运行失败任务的文档

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — this is a mechanical MTP recipe update (nightly image bump, EAGLE3-GQA draft head, TRITON_ATTN→FLASH_ATTN, consolidated --attention-config, dropped now-fixed contiguity patch) applied consistently to both the b200/b300 scripts and their config entries. The two findings are non-blocking nits (stale descriptive comments in nvidia-master.yaml, missing bilingual PR title/section) that don't affect runtime behavior.

Extended reasoning...

Overview

Touches two benchmark recipe scripts (minimaxm3_fp8_b200_mtp.sh, minimaxm3_fp8_b300_mtp.sh), the corresponding configs/nvidia-master.yaml entries, and perf-changelog.yaml. Changes: bump the vLLM image to a pinned nightly, rename the EAGLE3 draft head to the GQA variant, switch the speculative attention backend from TRITON_ATTN to FLASH_ATTN, consolidate two --attention-config flags into one JSON object, bump --stream-interval to 32, and delete an inline Python monkey-patch for a contiguity bug now fixed upstream in the nightly image.

Security risks

None. This is benchmark harness/config code with no auth, crypto, or user-facing surface — it only affects how a benchmark server is launched and reports perf numbers.

Level of scrutiny

Low-to-moderate is appropriate: this is CI benchmark infrastructure, not production-serving code, and the change follows an established pattern already used by sibling h200/h100 mtp recipes in the same file (same GQA/FLASH_ATTN combination). I checked that the --attention-config consolidation preserves the same effective keys as the previous split-flag form used in the non-mtp sibling scripts, and that the removed contiguity patch is justified by the PR description (fix now ships in the nightly image) rather than silently dropped.

Other factors

Both bug-hunter findings are nits: stale prose comments in configs/nvidia-master.yaml that were correctly updated in the .sh files but missed in the YAML, and a missing bilingual PR title/description per this repo's AGENTS.md convention. Neither affects the actual recipe behavior or benchmark correctness, so they don't block approval.

Comment on lines 7461 to 7467
# precedent: spec decode pays off at low/mid concurrency while acceptance
# dilutes in big batches, and the draft weights + draft KV shave headroom.
minimaxm3-fp8-b200-vllm-mtp:
image: vllm/vllm-openai:minimax-m3-0618-x86_64-cu130
image: vllm/vllm-openai:nightly-4080263bb2c5d10deac17aaeb88e0823bc35bca9
model: MiniMaxAI/MiniMax-M3-MXFP8
model-prefix: minimaxm3
runner: b200-dgxc

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 The config comments above minimaxm3-fp8-b200-vllm-mtp (~line 7458-7459) and minimaxm3-fp8-b300-vllm-mtp (~line 7513) still say the drafter is 'Inferact/MiniMax-M3-EAGLE3' pinned to 'TRITON_ATTN', but this PR switches both recipes to 'Inferact/MiniMax-M3-EAGLE3-GQA' with 'FLASH_ATTN'. Please update these two comment blocks to match, similar to how the h200/h100 mtp entries already describe the FLASH_ATTN/GQA rationale.

Extended reasoning...

configs/nvidia-master.yaml contains a hand-written comment block directly above each minimaxm3-fp8-*-vllm-mtp config entry explaining the EAGLE3 speculative-decoding setup for that recipe. For minimaxm3-fp8-b200-vllm-mtp the comment (around lines 7456-7459) reads: "...adds the Inferact/MiniMax-M3-EAGLE3 draft head... The target uses the FlashInfer TRT-LLM attention path. The EAGLE3 drafter is pinned separately to TRITON_ATTN." For minimaxm3-fp8-b300-vllm-mtp the comment (around lines 7511-7513) similarly references the plain Inferact/MiniMax-M3-EAGLE3 draft head with no attention-backend caveat.

This PR changes exactly what those comments describe: the draft head becomes Inferact/MiniMax-M3-EAGLE3-GQA and the speculative attention_backend moves from TRITON_ATTN to FLASH_ATTN (visible in the matching .sh recipe diffs, where the header comments were correctly updated: "Inferact/MiniMax-M3-EAGLE3-GQA draft head" and "The EAGLE3-GQA drafter is pinned separately to FLASH_ATTN."). However, the diff hunk touching configs/nvidia-master.yaml only replaces the image: line inside each block (lines 7461-7467 for b200, 7517-7523 for b300) — the descriptive comment lines sitting just above those keys were left untouched.

The result is that after this PR merges, the YAML comments for the b200 and b300 mtp entries misdescribe the actual recipe: they name the wrong draft-head repo (missing "-GQA") and, for b200, explicitly claim the drafter is "pinned to TRITON_ATTN" when it is now pinned to FLASH_ATTN. This is a real inconsistency the PR introduces/worsens, not a pre-existing one, since the PR's own script changes are what make the comments wrong. Contrast this with the sibling h200/h100 mtp entries further down in the same file (~lines 7539-7546 and 7565-7570), which already correctly explain the FLASH_ATTN/GQA rationale — those are the template this PR's two comment blocks should be brought in line with.

Step-by-step proof: (1) Before this PR, b200 mtp comment says draft head = Inferact/MiniMax-M3-EAGLE3, backend = TRITON_ATTN, matching the old script's DRAFT_MODEL="Inferact/MiniMax-M3-EAGLE3" and "attention_backend": "TRITON_ATTN". (2) This PR's diff to minimaxm3_fp8_b200_mtp.sh changes DRAFT_MODEL to "Inferact/MiniMax-M3-EAGLE3-GQA" and attention_backend to "FLASH_ATTN", and updates that script's own header comment to match. (3) The configs/nvidia-master.yaml diff for the same recipe only touches the image: line — the comment block above it is byte-for-byte identical to before. (4) Therefore post-merge, the YAML comment and the actual recipe behavior diverge: reading the config comment alone, a maintainer would believe the drafter still uses TRITON_ATTN with the non-GQA head, which is now false. The same divergence applies to the b300 comment (missing "-GQA" and no FLASH_ATTN mention).

This is comment-only and has zero effect on runtime behavior — the scripts themselves (the actual source of truth for how the benchmark runs) are correct. So while it's a genuine, PR-introduced inconsistency worth fixing to keep the config self-documenting, it doesn't block anything at merge. Fix: update the two comment blocks in configs/nvidia-master.yaml to say "Inferact/MiniMax-M3-EAGLE3-GQA draft head" and "pinned separately to FLASH_ATTN" (b200) / add the same GQA/FLASH_ATTN mention (b300), mirroring the phrasing already used in the h200/h100 mtp comments.

Comment thread perf-changelog.yaml
Comment on lines +5069 to +5074

- config-keys:
- minimaxm3-fp8-b200-vllm-mtp
- minimaxm3-fp8-b300-vllm-mtp
description:
- "Bump image to vllm/vllm-openai:nightly-4080263bb2c5d10deac17aaeb88e0823bc35bca9; set --stream-interval 32; consolidate --attention-config with indexer_kv_dtype fp8; drop the sparse_attention_msa contiguity patch (shipped in the nightly image)"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 This PR's title and description are English-only, but AGENTS.md mandates bilingual PR titles/descriptions (title format <English title> / <中文标题> and a mirroring ## 中文说明 body section) for every PR. Please add the Chinese title suffix and a Chinese translation section before merging.

Extended reasoning...

AGENTS.md line 7 states, as a top-level mandatory rule (not subjective style): "PR and GitHub-issue titles & descriptions must be bilingual — include a Simplified Chinese version in addition to English. Title format: <English title> / <中文标题>. In the PR/issue body, follow the English content with its Chinese translation (e.g. a ## 中文说明 section mirroring the summary...). This applies to every PR and every issue." CLAUDE.md forwards all repo guidance to AGENTS.md, so this rule governs review of this PR.

The violation: The PR title is [NV] minimax-m3-b200/b300-mtp: update fp8 MTP to vLLM nightly — English only, with no / <中文标题> suffix as the mandated format requires. The PR description's Summary section (bump image, EAGLE3-GQA draft head, FLASH_ATTN backend, consolidated --attention-config, dropped contiguity patch) has no mirroring ## 中文说明 section translating those same points into Simplified Chinese.

Why this isn't caught elsewhere: The only automated enforcement visible in the PR timeline is the codeowner-signoff-verify bot, which checks for the English sign-off phrase As a PR reviewer and CODEOWNER, I have reviewed this and have — it does not check PR title/body bilinguality. AGENTS.md's own exception list (CODEOWNER sign-off template stays English-verbatim; bot-generated comments follow their own templates) does not cover the human-authored title/description, so no carve-out applies here.

Step-by-step proof:

  1. Read AGENTS.md line 7: rule requires <English title> / <中文标题> format and a ## 中文说明 mirror in the body, applying to "every PR."
  2. Read the PR metadata: title = [NV] minimax-m3-b200/b300-mtp: update fp8 MTP to vLLM nightly — no / separator, no Chinese characters anywhere.
  3. Read the PR description: only a ## Summary section in English with five bullet points; no ## 中文说明 or any Chinese text follows it.
  4. Cross-check the exceptions in AGENTS.md (CODEOWNER sign-off verbatim text, bot templates) — neither applies to this human-authored title/body — so the rule is violated with no exemption.

Impact and fix: This is a metadata/process gap, not a code defect — nothing breaks at runtime, no benchmark or config behavior is affected, and the fix is simply editing the PR title and appending a ## 中文说明 section (following the translation quality bar in AGENTS.md, e.g. matching vllm-ascend's README.zh.md style) — no code changes or re-review of the diff are required. Given that, while it's a genuine, explicit repo requirement worth flagging, it doesn't rise to a blocking correctness issue.

@github-actions

Copy link
Copy Markdown
Contributor

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

@xinli-sw

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run

@Ankur-singh Ankur-singh changed the title [NV] minimax-m3-b200/b300-mtp: update fp8 MTP to vLLM nightly [NV] minimax-m3-b200/b300-mtp: update fp8 MTP to vLLM nightly / [NV] minimax-m3-b200/b300-mtp:将 FP8 MTP 更新至 vLLM nightly Jul 27, 2026
@Ankur-singh

Copy link
Copy Markdown
Collaborator

As a PR reviewer and CODEOWNER, I have reviewed this and have:

  • Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
  • Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
  • Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this. Run Sweep 30216094952, attempt 1
  • Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. Run Sweep 30216094952, attempt 1
  • Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
  • For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
  • Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; FLOPs at lower precisions is fine, given that the config passes private evals. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
  • If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
  • If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
  • Verified that every single-node vLLM/SGLang recipe in this PR is documented in the official vLLM recipes and/or the SGLang cookbook:
    • I linked the corresponding upstream PR in the vLLM recipe repo or SGLang repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
  • Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/<PR_NUMBER>.md — named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section.
  • If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.

Additional detail section:

Signed: Ankur-singh

@Klaud-Cold

Copy link
Copy Markdown
Collaborator

❌❌❌ REJECTED ❌❌❌

@Ankur-singh — blocking: this PR serves the Inferact/MiniMax-M3-EAGLE3-GQA draft head, but no merged/published upstream recipe documents it — the linked vllm-project/recipes#682 (and the published recipe page) pin Inferact/MiniMax-M3-EAGLE3. Merge an upstream recipe update covering the GQA draft head, then re-sign.

✅ Check 0 (CODEOWNER): PASS — Ankur-singh owns configs/nvidia-master.yaml; the remaining changed paths carry only the catch-all.
✅ Check 1 (sweep on in-PR commit): PASS — PR tip still 315b9a0; it has 55 green single-node 8k1k / and 14 green eval / executed jobs, zero failures, in run 30216094952.
✅ Check 2 (evals pass): PASS — GSM8K em_strict 0.9515–0.9613 (n_eff 1319) across all 14 eval configs vs the 0.90 bar, run on this PR's image vllm/vllm-openai:nightly-4080263bb2c5d10deac17aaeb88e0823bc35bca9.
❌ Check 3 (recipe merged & matches): FAIL — MAJOR arg contradicts the merged recipe: --speculative-config draft model is Inferact/MiniMax-M3-EAGLE3-GQA, while vllm-project/recipes#682 (merged 83ff280) and https://recipes.vllm.ai/MiniMaxAI/MiniMax-M3 document only Inferact/MiniMax-M3-EAGLE3; EAGLE3-GQA appears nowhere in vllm-project/recipes or the SGLang cookbook, so the community cannot reproduce this spec-decode profile from upstream docs. The sign-off's self-declared "accepted recipe exception" does not meet the merged-documentation standard. Informational (not blocking): target FLASHINFER/use_trtllm_attention is the Blackwell auto-selected default, indexer_kv_dtype fp8 and fp8 KV are upstream-documented, drafter FLASH_ATTN matches the recipe, and --stream-interval/batching knobs are harness tuning.
✅ Check 4 (reuse command): PASS — /reuse-sweep-run by COLLABORATOR xinli-sw.
✅ Check 5 (latest template): PASS — all current-template items present; the two unchecked items (code quality, agentic AL) are explained in the additional detail section.
✅ Check 6 (upstream image, engine-first): PASS — both entries run upstream vllm/vllm-openai:nightly-4080263… on B200/B300; framework is vLLM itself.
✅ Check 7 (no architecture hacks): PASS — no --hf-overrides/FLOPs reduction; indexer/KV fp8 is a precision choice backed by passing evals.
✅ Check 8 (spec-decode chat template): PASS — both MTP scripts at 315b9a0 benchmark via run_benchmark_serving … --use-chat-template.
✅ Check 9 (no engine patches): PASS — this PR removes the inline sparse_attention_msa heredoc patch; no engine patching remains.
➖ Check 10 (agentic golden AL): N/A — non-agentic fixed_seq_len configs; no simulated-acceptance knobs introduced.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants